Custom Types dan Abilities
Selamat sudah mencapai setengah perjalanan kursus! Di pelajaran ini kita membahas abilities—“kemampuan” yang melekat pada tipe (khususnya struct) untuk menentukan apa yang boleh dilakukan terhadap nilainya.
Apa Itu Abilities?
Dalam Move, abilities adalah aturan/izin (permission) yang menentukan operasi apa yang boleh dilakukan pada sebuah nilai. Mirip hak: boleh disalin, boleh dibuang, boleh disimpan di storage global, atau boleh menjadi kunci objek global.
Sebagian instruksi bytecode mensyaratkan tipe punya ability tertentu sebelum dijalankan. Dengan begitu, penggunaan data lebih aman dan terkontrol.
Sintaks Abilities
Abilities ditambahkan setelah deklarasi struct dengan kata kunci has.
public struct StructName has {
...
}
Contoh:
public struct Color has key, store {
id: UID,
red: u8,
}
Empat Ability Utama
copy: nilai bisa digandakan (di-copy)drop: nilai boleh dibuang (di-pop/destroy) tanpa harus dipakaistore: nilai boleh disimpan di dalam struct yang berada di global storagekey: struct bisa menjadi objek global (punya identitas / UID) untuk operasi storage
Kita bahas satu per satu.
Ability key
key memungkinkan tipe menjadi “global object” (memiliki identitas di storage). Jika sebuah struct punya key, semua field-nya harus punya (atau secara implisit memenuhi) syarat store. Contoh:
module examples::copy {
public struct ExampleObject has key { id: UID }
public entry fun new(ctx: &mut TxContext): ExampleObject {
let object = ExampleObject { id: object::new(ctx) };
object
}
}
Ability store
store memungkinkan nilai eksis di global storage. Praktiknya: bila struct jadi object on-chain, biasanya ditulis has key, store. Contoh:
module examples::copy {
public struct ExampleObject has key, store { id: UID }
public entry fun new(ctx: &mut TxContext): ExampleObject {
let object = ExampleObject { id: object::new(ctx) };
object
}
}
Di Sui Move, key wajib untuk object; store sangat umum tapi secara teknis bisa opsional tergantung kasus.
Ability copy
Memungkinkan nilai digandakan dengan operator copy. Contoh sederhana:
module examples::copy_demo {
public struct ExampleObject has key, copy { id: UID }
public entry fun new(ctx: &mut TxContext) {
let object = ExampleObject { id: object::new(ctx) };
let another = copy object; // menggandakan
another; // konsumsi (supaya tidak warning unused)
}
}
Ability drop
Memungkinkan nilai dibuang tanpa harus dipakai. Namun untuk object on-chain (memiliki UID), tidak bisa sekadar “hilang” begitu saja: biasanya perlu mekanisme destroy yang eksplisit agar aman. Jadi meski drop di-deklarasikan, penghapusan object dengan UID tetap dibatasi aturan Sui.
Penutup
Abilities penting untuk model keamanan Move. Kamu sudah sering melihat has key, store sebelumnya—sekarang kamu tahu alasannya. Selanjutnya kita akan mendalami object di Sui dan melihat lebih banyak contoh penerapan abilities.